# Python 列表用作队列的实现

# 队列是一种先进先出（FIFO, First-In-First-Out）的数据结构，意味着最早添加的元素最先被移除
# 它只允许在队尾添加元素，在队头删除元素。
# 队列的操作有两种：入队（enqueue）和出队（dequeue）。
# 入队操作是指在队尾添加一个元素，出队操作是指从队头删除一个元素。

# 使用列表实现的队列如果频繁的在开头插入或删除元素，性能会受到影响，因为这些操作的时间复杂度是 O(n)。
# 为了解决这个问题，Python 提供了 collections.deque，它是双端队列，可以在两端高效地添加和删除元素
# collections.deque是Python标准库的一部分，可以直接使用。

#        队头 << ======================================== << 队尾

from collections import deque

# 创建一个空队列
queue = deque()

# 入队操作
queue.append('a')
queue.append('b')
queue.append('c')
print("队列元素：", queue)

# 从对头删除元素
first = queue.popleft()
print("从队头删除的元素：", first)
print("删除后的队列元素：", queue)

# 查看队头元素(不移除)
print("队头元素：", queue[0])

# 队列是否为空
print("队列是否为空：", not queue or len(queue) == 0)

# 队列大小
print("队列大小：", len(queue))



# 使用列表实现的队列(不推荐)
class Queue:
    def __init__(self):          # 构造函数初始化一个空队列
        self.queue = []

    def enqueue(self, item):            # 入队操作，在队尾添加一个元素
        self.queue.append(item)

    def dequeue(self):                  # 出队操作，从队头删除一个元素
        if not self.is_empty():
            return self.queue.pop(0)
        else:
            raise IndexError("dequeue from empty queue")

    def peek(self):                     # 查看队头元素，不移除
        if not self.is_empty():
            return self.queue[0]
        else:
            raise IndexError("peek from empty queue")

    def is_empty(self):                 # 队列是否为空
        return len(self.queue) == 0

    def size(self):                     # 队列大小
        return len(self.queue)

# 使用示例
queue = Queue()
queue.enqueue('a')
queue.enqueue('b')
queue.enqueue('c')

print("队首元素:", queue.peek())    # 输出: 队首元素: a
print("队列大小:", queue.size())    # 输出: 队列大小: 3

print("移除的元素:", queue.dequeue())  # 输出: 移除的元素: a
print("队列是否为空:", queue.is_empty())  # 输出: 队列是否为空: False
print("队列大小:", queue.size())    # 输出: 队列大小: 2
